'''
练习：请计算200以内的所有质数。
什么是质数：除了1和自身以为，没有可以被整除因子。
如何判断整除：number % i == 0，表明可以整除。或判断 number / i 是否与 number // i 相等。
如何来整除1到自身的所有数？循环从1到自身，并逐个尝试。
200以内就从1到200做循环，对每一个数字进行判断即可。
'''

# 先来判断某一个数字是否是质数，如数字15, 19, 21, 37

# 遍历1到200的所有数字
# for number in range(1, 201):
#     count = 0   # 定义一个变量用于统计被整除的次数
#
#     # 从1到该数字之间进行整除，来判断被整除的次数
#     for i in range(1, number+1):
#         if number % i == 0:
#             count += 1
#     # 如果仅有1和数字自身被该数字整除（2次），则说明该数字一定质数
#     if count == 2:
#         print(f"{number} 是一个质数.")



# 统计一下该代码运行的次数：20100
# loop = 0
#
# for number in range(1, 201):
#     count = 0
#     for i in range(1, number+1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#     if count == 2:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)



# 统计一下该代码运行的次数：19503
# loop = 0
#
# for number in range(2, 201):
#     count = 0
#     for i in range(2, number):
#         loop += 1
#         if number % i == 0:
#             count += 1
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)


# 统计一下该代码运行的次数：9702
# loop = 0
#
# for number in range(2, 201):
#     count = 0
#     for i in range(2, int(number/2) + 1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)


# 统计一下该代码运行的次数：1586
# import math
# loop = 0
#
# for number in range(2, 201):
#     count = 0
#     for i in range(2, int(math.sqrt(number)) + 1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)



# 统计一下该代码运行的次数：627
# import math
# loop = 0
#
# for number in range(2, 201):
#     count = 0
#     for i in range(2, int(math.sqrt(number)) + 1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#             break
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)


# 统计一下该代码运行的次数：529
# import math
# loop = 0
#
# print("2 是一个质数")
# for number in range(3, 201, 2):
#     count = 0
#     for i in range(2, int(math.sqrt(number)) + 1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#             break
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)



# 统计一下该代码运行的次数：466
# import math
# loop = 0
#
# print("2 是一个质数")
# for number in range(3, 201, 2):
#     if number % 5 == 0:
#         continue            # 让循环跳过本次，继续到下一次
#
#     count = 0
#     for i in range(2, int(math.sqrt(number)) + 1):
#         loop += 1
#         if number % i == 0:
#             count += 1
#             break
#     if count == 0:
#         print(f"{number} 是一个质数.")
#
# print("本次循环次数为: %d" % loop)



# 统计一下该代码运行的次数：529
# import math
#
# print("2 是一个质数")
# for number in range(3, 201, 2):
#     is_prime = True
#     for i in range(2, number):
#         if number % i == 0:
#             is_prime = False
#             break
#     if is_prime == True:
#         print(f"{number} 是一个质数.")




# 统计一下该代码运行的次数：99
# loop = 0
#
# print("2 是一个质数\n3 是一个质数\n5 是一个质数\n7 是一个质数\n11 是一个质数\n13 是一个质数")
# for number in range(3, 201, 2):
#     loop += 1
#     if number % 3 == 0 or number % 5 == 0 or number % 7 == 0 or number % 11 == 0 or number % 13 == 0:
#         continue  # 让循环跳过本次，继续到下一次
#
#     print(f"{number} 是一个质数")
#
# print("本次循环次数为: %d" % loop)



# 统计一下该代码运行的次数：利用for...else....
for number in range(3, 201, 2):
    for i in range(2, number):
        if number % i == 0:
            break
    else:
        print(number)






# # 今日练习：2， 5， 7， 9
# 1. 水仙花数：计算三位整数（100～999）的水仙花数。水仙花数是指每一位的立方相加等于该数自己，比如153 = 1^3 + 5^3 + 3^3。
# 2. 统计字符：从键盘输入一个字符串，统计这个字符串当中包含几个大写字母，几个小写字母，几个数字，几个特殊符号。
# 3. 组合问题：用1元纸币兑换1分，2分和5分的硬币，要求兑换总数为50枚，问可以有多少种组合，每种组合对应1分，2分，5分分别是多少？
# 4. 九九乘法表：尝试用for循环完成九九乘法表输出。
# 5. 数字处理：用户输入一个正整数，将该正整数倒序输出，并求各位数相加之和。（要求，不允许把用户输入的正整数，
#    处理为字符串，只能按照数值运算的规律完成本题。
# 扩展5： 完成此题后，可进一步求小数的每一位之和，如1234.567，并让该小数顺序按位输出。
# 6. 猜数字游戏：系统随机生成一个1000以内的正整数，用户输入一个数字，如果输入数字大于系统数字则提示‘大了’，
#    反之提示‘小了’，直到相等游戏结束，提示‘通关并输出 猜测次数。（提示：可以import random来生成随机数）。
# 7. 字符串判断：从键盘输入一个字符串，判断该字符串是否可以被转换为一个有效的数字。(禁止使用Python自带方法完成)
# 8. 定义一个列表，里面包含有20个左右的学生姓名，请实现随机点名的功能。
# 9. 给定一个列表，里面包含一批纯数字，按从小到大对其进行排序（禁止使用Python自带的sort方法）
# 写完代码就要注释，麻烦，有没有方法能够简洁一点？请预习函数。



# 2. 统计字符：从键盘输入一个字符串，统计这个字符串当中包含几个大写字母(65-90)，几个小写字母(97-122)，几个数字(48-57)，几个特殊符号。
# string = "Hello123你Good%^@#"   # 2 7 3 5

# for i in range(len(string)):
#     print(string[i])

#     # if 65 <= ascii <= 90:
#     #     pass
#     #
#     # if ascii in range(65, 91):
#     #     pass

# upper = 0
# lower = 0
# digit = 0
# other = 0
#
# for c in string:
#     ascii = ord(c)
#     if ascii >= 65 and ascii <= 90:
#         upper += 1
#     elif ascii >= 97 and ascii <= 122:
#         lower += 1
#     elif ascii in range(48, 58):
#         digit += 1
#     else:
#         other += 1
#
#
# print(f"大写：{upper}，小写：{lower}，数字：{digit}，其他：{other}")
# print("大写：%d，小写：%d，数字：%d，其他：%d" % (upper, lower, digit, other))




# 5. 数字处理：用户输入一个正整数，将该正整数倒序输出，并求各位数相加之和。
# 246785：
# 246785 // 1 % 10 = 5      246785 // 10 % 10        246785  // 100 % 10     246785 // 1000 % 10  .... 0
# 由于并不知道数字的位数，所以不能使用for循环，只能选择while
# 通常情况下，for循环用于明确知道循环次数的情况，while循环用于不知道循环次数，但是知道结束条件。

# number = 246785      # 587642  32

# number = int(input("请输入一个数字："))
# sum = 0
# while number > 0:
#     temp = number % 10
#     sum += temp
#     print(temp, end='')
#     number //= 10
#
# print("\n每一位之和为：%d" % sum)

# print('\n%d' % number)

# 补充知识：print的分隔符和结束符的自定义
# print(100, 200, 300, sep="*****", end='#########################')
# print(100, 200, 300, sep="+++++")




# 7. 字符串判断：从键盘输入一个字符串，判断该字符串是否可以被转换为一个有效的数字。(禁止使用Python自带方法完成)
# 自带的方法：string.isnumeric()，try...except...加int()或float()，禁止使用
# 按该字符串的每一位字符的规律特征，来进行判断
# 有效的数字：12345, -12345, 123.45：由0-9的数字，或一个负号，或一个小数点构成，不能包含其他字符，且负号必须在第1位。
# 无效的数字：123.45.6， --12345， 123-5， -123.5.4， 123T5

# string = "12-34.5"
# negative = 0
# point = 0
# for c in string:
#     code = ord(c)
#     if code < 48 or code > 57:
#         if code != 45 and code != 46:
#             print("无效")
#             break
#         if code == 45:
#             negative += 1
#         if code == 46:
#             point += 1
#
# if negative > 1:
#     print("无效")
# if point > 1:
#     print("无效")
# if negative == 1 and string[0] != '-':
#     print("无效")
#
# print("有效")


# string = "-12T34.5"
# negative = 0
# point = 0
# is_valid = True
# for c in string:
#     code = ord(c)
#     # if (code < 48 or code > 57) and (code != 45) and (code != 46):
#     if (code < 48 and code != 45 and code != 46) or code > 57:
#         is_valid = False
#         break
#     elif code == 45: negative += 1
#     elif code == 46: point += 1
#
# if negative > 1: is_valid = False
# if point > 1: is_valid = False
# if negative == 1 and string[0] != '-': is_valid = False
#
# if is_valid:
#     print("有效")
# else:
#     print("无效")








#
# list = [11,7,22,40,33,29]
# for i in range(0,2):
#     for j in range(0,len(list)-i-1):
#         if list[j] > list[j+1]:
#             temp = list[j]
#             list[j] = list[j+1]
#             list[j+1] = temp
# print(list)

#完成此题后，可进一步求小数的每一位之和，如1234.567，并让该小数顺序按位输出。



# num=float(input("please input a num:"))
#
# num1=num-int(num)
# count=0
# while num1>0:
#     all=num1*10
#     a=int(all)
#     count+=a
#     print(a,end="")
#     num1=all-a
# print("")
# print(count)


# 纯粹求小数部分的每一位之和并顺序输出每一位
# 方案一：1234.567-1234=0.567，每一次循环乘以10取整 0.567*10=5.67，对int(5.67)，再取剩余小数部分
# 方案二：1234.567-1234=0.567，每一次循环乘以10，不有取整，继续乘以10，直到它变成一个整数，再用整数的方式来处理
# number = 1234.567
# point = number - int(number)   # 精度丢失问题
# while point > 0:
#     new = point * 10
#     integer = int(new)
#     print(integer, end='')
#     point = new - integer


# number = 1234.567
# point = number - int(number)     # 精度丢失问题
# sum = 0
# while point != int(point):
#     point = point * 10
#     temp = int(point) % 10
#     sum += temp
#     print(temp, end=' ')
# print("和为：%d" % sum)


# 原题意：将1234.567的全部数字部分顺序输出：1 2 3 4 5 6 7，并计算和为：28
# 方案一：连续地将该数字除以10，直到变成一个纯粹的小数，即0.xxxxxx，然后按照上面的算法解决。
# 方案二：连续地将该数字乘以10，直到变成一个纯粹的整数。
# number = 10001.567
# while int(number) >= 1:
#     number /= 10
#
# sum = 0
# while number != int(number):
#     number = number * 10
#     temp = int(number) % 10
#     sum += temp
#     print(temp, end=' ')
# print("和为：%d" % sum)


# number = 1234.5678
# while number != int(number):
#     number *= 10


